package org.dromara.tearoom.util;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;



public class AESUtil {
    // 密钥（必须与加密和解密时一致）
    private static final String SECRET_KEY = "xchadmin666"; // 16字节（128位）或 24字节（192位）或 32字节（256位）
    // 密钥长度（32 位）
    private static final int KEY_LENGTH = 32;
    // 定义密钥字符集（包含大小写字母、数字和特殊符号）
    private static final String CHARACTERS =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +  // 大写字母
                    "abcdefghijklmnopqrstuvwxyz" +  // 小写字母
                    "0123456789" ;                  // 数字
    //                "!@#$%^&*()_+=";               // 特殊符号（可根据需求调整）
    public static void main(String[] args) throws Exception {
        /*String plainText = "Hello, World!"; // 明文

        // 加密
        String encrypted = encrypt(plainText);
        System.out.println("加密后: " + encrypted);

        // 解密
        String decrypted = decrypt(encrypted);
        System.out.println("解密后: " + decrypted);*/

        String key = generateApiv2Key(KEY_LENGTH);
        System.out.println("生成的密钥: " + key);
    }

    // 加密方法
    public static String encrypt(String plainText) throws Exception {
        // 生成 AES 密钥（将字符串密钥转换为字节数组）
        SecretKeySpec keySpec = generateKey(SECRET_KEY);

        // 初始化 AES 加密器
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // ECB 模式（简单但不安全，仅示例用）
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);

        // 执行加密
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes); // Base64 编码便于显示和传输
    }

    // 解密方法
    public static String decrypt(String encryptedText) throws Exception {
        // 生成 AES 密钥
        SecretKeySpec keySpec = generateKey(SECRET_KEY);

        // 初始化 AES 解密器
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, keySpec);

        // 解码 Base64 并解密
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes);
    }

    // 生成 AES 密钥（将字符串转换为固定长度的密钥）
    private static SecretKeySpec generateKey(String key) throws NoSuchAlgorithmException {
        // 使用 SHA-256 哈希生成固定长度的密钥（AES-128 需要 16 字节）
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] digest = md.digest(key.getBytes());
        byte[] keyBytes = new byte[16]; // 128位密钥
        System.arraycopy(digest, 0, keyBytes, 0, keyBytes.length);

        return new SecretKeySpec(keyBytes, "AES");
    }
    /**
     * 使用 SecureRandom 生成安全的随机密钥
     * @param length 密钥长度
     * @return 安全的随机字符串
     */
    public static String generateApiv2Key(int length) {
        SecureRandom random = new SecureRandom();
        StringBuilder key = new StringBuilder(length);

        for (int i = 0; i < length; i++) {
            // 随机选择字符集中的一个字符
            int index = random.nextInt(CHARACTERS.length());
            key.append(CHARACTERS.charAt(index));
        }

        return key.toString();
    }
}





